package utils

import (
	"fmt"
	"time"
)

// CalculateStartDateRange 计算起始日对应的区间
// yearMonth 格式为 "YYYY-MM"
// startDay 为起始日（1-31）
// 返回区间 [start, end]（左右均包含）
func CalculateStartDateRange(yearMonth string, startDay int) (start, end time.Time, err error) {
	// 解析年月
	ym, err := time.Parse("2006-01", yearMonth)
	if err != nil {
		return time.Time{}, time.Time{}, fmt.Errorf("无效的年月格式: %s", yearMonth)
	}
	year := ym.Year()
	month := ym.Month()

	// 验证起始日有效性
	if startDay < 1 || startDay > 31 {
		return time.Time{}, time.Time{}, fmt.Errorf("无效的起始日: %d", startDay)
	}

	// 计算起始日：存在则用原日，不存在则顺延1天
	startDate := time.Date(year, month, startDay, 0, 0, 0, 0, time.UTC)
	if startDate.Month() != month { // 起始日超出当月天数（如2月30日）
		startDate = time.Date(year, month+1, 1, 0, 0, 0, 0, time.UTC) // 下个月的第1天
	}

	// 计算下个月（用于确定结束日）
	nextMonth := month + 1
	nextYear := year
	if nextMonth > 12 { // 跨年处理
		nextMonth = 1
		nextYear++
	}

	// 计算下个月的对应起始日（用于推导结束日）
	nextStartDate := time.Date(nextYear, nextMonth, startDay, 0, 0, 0, 0, time.UTC)
	var endDate time.Time

	if nextStartDate.Month() == nextMonth { // 下个月存在该起始日
		endDate = nextStartDate.AddDate(0, 0, -1) // 结束日 = 下个月起始日 -1天
	} else { // 下个月不存在该起始日
		endDate = time.Date(nextYear, nextMonth+1, 0, 0, 0, 0, 0, time.UTC) // 下个月最后一天
	}

	return startDate, endDate, nil
}
